import store from '../../store' // 状态管理
import {
	isWechat,
	encodeRedirectUrl
} from '../../common/util.js'
import Request from './request.js'
import Config from '../config.js'

export const http = new Request();

// 设置全局配置
http.setConfig((config) => {
	config.baseUrl = Config.baseUrl;
	config.header = {
		'Content-Type': 'application/json;charset=UTF-8'
	};

	return config
})


// 请求之前拦截器
http.interceptor.beforeRequest((config, cancel) => {
	console.log('请求前拦截', config.url, config)
	if (config.onlyCard) { // 礼品卡
		// 登录校验
		let cardId = store.getters.cardId;
		let cardKey = store.getters.cardKey;
		console.log('get.cardAuth', cardId, cardKey);
		if (!config.muteLogin) {
			if (!cardKey) {
				console.error('needLogin request');
				cancel('登录过期，尝试重试!'); // 取消请求
				uni.reLaunch({
					url: '/pages/card/login?cid=' + (cardId || 0)
				});
				return;
			}

			config.url += '?card_key=' + cardKey;
		}
		config.url += (config.url.indexOf('?') === -1 ? '?' : '&') + 'card_id=' + cardId;
	} else if (config.onlyPrev) { // 预览
		config.url += '?flag='+config.flag+'&card_pre_key='+config.card_pre_key+'&card_id='+config.card_id;
		if (config.id !== undefined) {
			config.url += (config.url.indexOf('?') === -1 ? '?' : '&') + 'id=' + config.id;
		}
	} else { // 兑换活动
		// 登录校验
		let accessToken = store.getters.accessToken;
		let activityId = store.getters.activityId;
		console.log('get.accessToken', accessToken, activityId);
		if (!config.muteLogin) {
			if (!accessToken) {
				console.error('needLogin request');
				cancel('登录过期，尝试重试'); // 取消请求
				console.info('needLogin request', 'silentReload');
				silentReload(config.curd === 'save');
				return;
			}

			config.url += '?token=' + accessToken;
		}
		config.url += (config.url.indexOf('?') === -1 ? '?' : '&') + 'activity_id=' + activityId;
	}

	// 平台
	// #ifdef  MP-WEIXIN
	config.url += (config.url.indexOf('?') !== -1 ? '&' : '?') + 'platform=mini';
	// #endif
	// #ifdef  H5
	if (isWechat()) {
		config.url += (config.url.indexOf('?') !== -1 ? '&' : '?') + 'platform=mp';
	}
	// #endif

	return config;
})

// 请求之后拦截器 
http.interceptor.afterRequest((response) => {
	console.log('请求后拦截', response);

	// 系统错误
	if (response.statusCode === 500) {
		console.error('系统错误');
		setTimeout(() => {
			uni.showToast({
				title: '系统错误',
				icon: 'none',
				mask: true,
				duration: 2000
			})
		}, 50);
		return [response];
	}

	let data = response.data;

	// 网络错误
	if (!data) {
		console.error('网络错误');
		setTimeout(() => {
			uni.showToast({
				title: '网络错误',
				icon: 'none',
				mask: true,
				duration: 2000
			})
		}, 50)
		return [response];
	}

	if (typeof data === 'string') {
		data = JSON.parse(data)
	}

	// 正常请求
	if (data.code === 1) {
		return [0, data.data || data.msg];
	}

	// 系统错误
	console.warn('invalid request', data.msg);
	switch (data.code) {
		case 401: // 认证失败
			console.error('needLogin 401');
			store.commit('delAccessToken'); // 删除token
			console.info('needLogin 401', 'silentReload');
			silentReload(response.config.curd === 'save');
			break;
		case 402: // 小程序自动登录失败
			break;
		default: // 错误提示
			setTimeout(() => {
				uni.showToast({
					title: data.msg || '网络错误',
					icon: 'none',
					mask: true,
					duration: 2000
				})
			}, 50)
			if (data.code === 403) { // 活动无效
				store.commit('delAccessToken'); // 删除token
				store.commit('delActivityId'); // 删除活动ID
				smartLogin();
			}
			if (data.code === 405) { // 礼品卡无效
				store.commit('delCardId'); // 删除礼品卡ID
				store.commit('delCardKey'); // 删除卡密登录信息
				uni.reLaunch({
					url: '/pages/user/tips'
				})
			}
			if (data.code === 406) { // 卡密无效
				store.commit('delCardKey'); // 删除卡密登录信息
				uni.reLaunch({
					url: '/pages/card/login?cid=' + (store.getters.cardId || 0)
				})

			}
			break;
	}

	return [response];
})

/**
 * 自动登录
 */
export function silentReload(warning = false, redirectUrl = null, ignoreConfig = false) {
	console.info('silentReload', warning, redirectUrl, ignoreConfig)
	if (warning) {
		setTimeout(() => {
			uni.showToast({
				title: '鉴权失败，请重新操作',
				icon: 'none',
				mask: true,
				duration: 2000
			})
		}, 50)
		return false
	}

	// 礼品卡
	if (store.getters.scenario === 'card') {
		uni.reLaunch({
			url: '/pages/card/index'
		})
		return false
	}

	// 并发处理
	if (!ignoreConfig) {
		if (store.getters.isLock('silentReload')) {
			return false
		}
		store.commit('lock', 'silentReload')
		setTimeout(() => {
			// 2秒后清理锁
			store.commit('unlock', 'silentReload')
		}, 2000)
	}
	console.info('try login', 'silentReload')

	// 配置未正确加载
	const globalConfig = store.getters.globalConfig
	if (!globalConfig || Object.keys(globalConfig).length === 0) {
		if (ignoreConfig) {
			console.log('load config fail', 'silentReload')
			setTimeout(() => {
				uni.reLaunch({
					url: '/pages/user/tips?cont=配置加载失败，请尝试重新进入'
				})
			}, 50)
		} else {
			console.log('wait to load config', 'silentReload')
			setTimeout(() => {
				silentReload(warning, redirectUrl, true)
			}, 800)
		}
		return true;
	}

	// 跳转页面
	if (redirectUrl === null) {
		redirectUrl = getRedirectUrl()
		console.log('getRedirectUrl', redirectUrl, 'silentReload')
	}

	// #ifdef  MP-WEIXIN
	console.info('mini_login', 'silentReload')
	// 微信小程序自动登录
	uni.reLaunch({
		url: '/pages/user/mini_login?from=' + encodeRedirectUrl(redirectUrl)
	})
	// #endif

	// #ifdef  H5
	if (isWechat()) {
		if (store.getters.globalConfig.mp_login) {
			console.info('mp_login', 'silentReload')
			// 微信公众号自动登录
			uni.reLaunch({
				url: '/pages/user/mp_login?from=' + encodeRedirectUrl(redirectUrl)
			})
		} else {
			console.info('smartLogin', 'silentReload')
			// 智能跳转
			smartLogin(redirectUrl)
		}
	} else {
		if (store.getters.globalConfig.only_mp) {
			console.info('请在微信中打开', 'silentReload')
			uni.reLaunch({
				url: '/pages/user/tips?cont=请在微信中打开'
			})
		} else {
			console.info('smartLogin', 'silentReload')
			// 智能跳转
			smartLogin(redirectUrl)
		}
	}
	// #endif

	return true
}

/**
 * 进入登录页面
 */
export function smartLogin(redirectUrl) {
	if (!redirectUrl) {
		redirectUrl = ''
	}
	// 有缓存的活动ID
	if (store.getters.activityId) {
		// 直接到登录页面
		uni.reLaunch({
			url: '/pages/user/login?once=1&redirect=' + redirectUrl
		})

		return true;
	}

	// 存在默认活动
	if (store.getters.globalConfig.default_activity) {
		// 直接到登录页面
		uni.reLaunch({
			url: '/pages/user/login?once=1&redirect=' + redirectUrl
		})
		return true;
	}

	// 可以选择活动
	if (store.getters.globalConfig.select_activity) {
		// 直接到活动列表
		uni.reLaunch({
			url: '/pages/home/dashboard'
		})
		return true;
	}

	// 需要扫码进入
	setTimeout(() => {
		uni.reLaunch({
			url: '/pages/user/tips'
		})
	}, 50)

	return true
}

export function getRedirectUrl() {
	let redirectUrl = '/pages/home/index'
	const pages = getCurrentPages()
	const currentPage = pages[pages.length - 1]
	if (currentPage) {
		if (currentPage.$page) {
			redirectUrl = currentPage.$page.fullPath
		}
	}

	return redirectUrl
}

export function showToast(text, icon) {
	return uni.showToast({
		title: text || '加载中',
		icon: icon || 'none',
		mask: true,
		duration: 2000
	})
}